import { KSpaceConfig } from '../types';

/**
 * 构建OSS请求URL
 * @param config 配置信息
 * @param resource 资源路径
 * @returns 完整的请求URL
 */
export function buildRequestUrl(
  config: KSpaceConfig,
  resource: string = ''
): string {
  const protocol = config.secure ? 'https' : 'http';
  let endpoint = config.endpoint;
  
  // 如果endpoint不包含协议，则添加协议
  if (!endpoint.startsWith('http://') && !endpoint.startsWith('https://')) {
    endpoint = `${protocol}://${endpoint}`;
  }
  
  // 确保resource以/开头
  const normalizedResource = resource.startsWith('/') ? resource : `/${resource}`;
  
  return `${endpoint}${normalizedResource}`;
}

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @returns 格式化后的大小字符串
 */
export function formatFileSize(bytes: number): string {
  if (bytes === 0) return '0 Bytes';
  
  const k = 1024;
  const sizes = ['Bytes', 'KB', 'MB', 'GB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

/**
 * 验证配置信息
 * @param config 配置信息
 * @throws Error 如果配置不合法
 */
export function validateConfig(config: KSpaceConfig): void {
  if (!config.endpoint) {
    throw new Error('Endpoint is required');
  }
  
  if (!config.accessKeyId) {
    throw new Error('AccessKeyId is required');
  }
  
  if (!config.accessKeySecret) {
    throw new Error('AccessKeySecret is required');
  }
  
  if (!config.bucket) {
    throw new Error('Bucket is required');
  }
}

/**
 * 生成文件URL
 * @param config 配置信息
 * @param key 文件路径
 * @param expires 过期时间（秒）
 * @returns 文件访问URL
 */
export function generateFileUrl(
  config: KSpaceConfig,
  key: string,
  expires?: number
): string {
  const protocol = config.secure ? 'https' : 'http';
  const endpoint = config.endpoint.replace(/^https?:\/\//, '');
  let url = `${protocol}://${config.bucket}.${endpoint}/${encodeURIComponent(key)}`;
  
  // 如果配置了过期时间，添加到URL参数
  if (expires) {
    url += `?Expires=${Math.floor(Date.now() / 1000) + expires}`;
  }
  
  return url;
}